package wangshuai.risk.dao.impl;

import java.sql.SQLException;
import java.util.List;

import javax.annotation.Resource;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
import publics.model.Ratio;
import wangshuai.risk.dao.RatioDao;

/**
 * 财务比率表的增删改查
 * @author wangshuai
 *
 */
@Component("ratioDao")//让spring扫描到这个bean
public class RatioDaoImpl implements RatioDao {
	
	private HibernateTemplate hibernateTemplate;// hibernate的spring代理模版

	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	// 注入 hibernate模版
	@Resource(name = "hibernateTemplate")	
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
		System.out.println("hibernateTemplate injected in RatioDaoImpl!");
		// 测试用，实际运行中可去掉这句
	}
	
	
	/**
	 * 保存财务比率表
	 * @param ratio 要保存的Ratio表的实例
	 */
	public Integer sava(Ratio ratio){	
		return (Integer)this.getHibernateTemplate().save(ratio);
	}
	
	/**
	 * 更新财务比率表
	 * @param  ratio 要更新的Ratio表实例
	 */
	public boolean update(Ratio ratio){
		try {		
			this.getHibernateTemplate().update(ratio);
		} catch (DataAccessException d) {
			return false;
		}
		return true;
		
	}

	/**
	 * 保存或修改财务比率表
	 * @param ratio 要修改或保存Ratio表的实例
	 */
/*	public void saveOrUpdate(Ratio ratio) {
		this.getHibernateTemplate().saveOrUpdate(ratio);

	}*/
	
	/**
     * 删除财务比率表
     * @param id 需要删除的财务比率表id
     */  
	public boolean deleteById(Integer id) {
		try {		
			this.getHibernateTemplate().delete(this.getHibernateTemplate().get(Ratio.class, id));
		} catch (DataAccessException d) {
			return false;
		}
		return true;
	}
	
	/**
     * 删除财务比率表
     * @param ratio 要删除的财务比率表实例
     *  @return boolean 删除成功 返回 true 否则 返回false
     */
    public boolean delete(Ratio ratio){
    	try {		
    		this.getHibernateTemplate().delete(ratio);
		} catch (DataAccessException d) {
			return false;
		}
		return true;
    	
    }
	
	/**
	 * 根据企业申请表的ID查找财务比率表
     * @param  appId 企业申请表的ID（主键）
     * @return 查到的所有该企业申请表对应的Ratio表(按 年份 降序排列)
	 */
	@SuppressWarnings("unchecked")
	public List<Ratio> findByAppId(Integer appId) {
		return (List<Ratio>)this.getHibernateTemplate()
			.find("from Ratio r where r.application.id = ? ", appId);
	}
	
	/**
	 * 据财务比率id查找 
	 * @param 财务比率表id
     * @return id对应的财务比率表
	 */
	public Ratio findById(Integer id) {
		
		return this.getHibernateTemplate().get(Ratio.class, id);
	}
	
	/**
	 * 查询所有财务比率表信息,分页查询
	 * @param hql 需要查询的hql语句
	 * @param offset 起始条目偏移量（offset == （要查询页码-1）*每页条数  ， 不知道对不对，忘了，页码不知是从0开始还是1开始）
	 * @param pageSiz  查询每页的条目数
	 * @return 查询出的财务比率表(结果集)
	 */
	@SuppressWarnings("unchecked")
	public List<Ratio> findByPage(final String hql, final int offset, final int pageSize) {
		List<Ratio> list = this.getHibernateTemplate().executeFind(
				new HibernateCallback() {
					public Object doInHibernate(Session session) throws HibernateException ,SQLException {
						//执行hibernate分页查询
						List<Ratio> result = session.createQuery(hql)
							.setFirstResult(offset)
							.setMaxResults(pageSize)
							.list();
						return result;
					}
				}
				);
		
		return list;
	}

	/* 查找符合条件的所有记录
	 * @see wangshuai.risk.dao.RatioDao#findAll()
	 */
	@SuppressWarnings("unchecked")
	public List<Ratio> findAll(String sql) {
		return this.getHibernateTemplate().find(sql);
	}

	/* 查找符合sql条件的 数据总数
	 * @see wangshuai.risk.dao.RatioDao#findByCount(java.lang.String)
	 */
	public int findByCount(String sql) {
		return this.getHibernateTemplate().find(sql).size();
	}


}
